package main.leetcode.clockin.Auguest;

/**
 * 43. 字符串相乘
 *
 * <p>给定两个以字符串形式表示的非负整数 num1 和 num2，返回 num1 和 num2 的乘积，它们的乘积也表示为字符串形式。
 *
 * <p>示例 1: 输入: num1 = "2", num2 = "3" 输出: "6"
 *
 * <p>示例 2: 输入: num1 = "123", num2 = "456" 输出: "56088"
 *
 * <p>说明：num1 和 num2 的长度小于110。 num1 和 num2 只包含数字 0-9。 num1 和 num2 均不以零开头，除非是数字 0 本身。
 * 不能使用任何标准库的大数类型（比如 BigInteger）或直接将输入转换为整数来处理。
 */
public class day13 {
    public static void main(String[] args) {
        System.out.println(new day13().multiply("123", "456"));
    }

    public String multiply(String num1, String num2) {
        if (num1 == null || num2 == null || num1.isEmpty() || num2.isEmpty()) {
            throw new RuntimeException("非法参数");
        }
        if (num1.length() < num2.length()) {
            return multiply(num2, num1);
        }
        if ("0".equals(num1) || "0".equals(num2)) {
            return "0";
        }
        int n = num2.length();
        String res = "";
        StringBuilder zeros = new StringBuilder();
        for (int i = n - 1; i >= 0; --i) {
            if (i < n - 1) {
                zeros.append("0");
            }
            String cur = calMulti(num1, num2.charAt(i) - '0') + zeros;
            res = calSum(cur, res);
        }
        return res;
    }

    private String calSum(String cur, String pre) {
        StringBuilder res = new StringBuilder();
        int i = cur.length() - 1;
        int j = pre.length() - 1;
        int carry = 0;
        while (i >= 0 || j >= 0) {
            int a = i < 0 ? 0 : cur.charAt(i) - '0';
            int b = j < 0 ? 0 : pre.charAt(j) - '0';
            int sum = a + b + carry;
            carry = sum / 10;
            res.append(sum % 10);
            --i;
            --j;
        }
        if (carry > 0) {
            res.append(carry);
        }
        return res.reverse().toString();
    }

    private String calMulti(String num, int multiplier) {
        int carry = 0;
        StringBuilder res = new StringBuilder();
        for (int i = num.length() - 1; i >= 0; --i) {
            int cur = (num.charAt(i) - '0') * multiplier + carry;
            res.append(cur % 10);
            carry = cur / 10;
        }
        if (carry > 0) {
            res.append(carry);
        }
        return res.reverse().toString();
    }
}
